Uria
Time Limit: 20 Sec Memory Limit: 512 MB
Description
从前有个正整数 n。
对于一个正整数对 (a,b),如果满足 a + b ≤ n 且 a + b 是 a * b 的因子,则成为神奇的数对。
求神奇的数对的个数。
一行一个正整数 n。
Output
一行一个整数表示答案,保证不会超过 64 位有符号整数类型的范围。
21
Sample Output
11
HINT
n ≤ 1e14
Solution
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| #include<bits/stdc++.h> using namespace std; typedef long long s64; typedef unsigned int u32;
const int ONE = 1e7 + 5; const u32 MOD = 20000116;
s64 n, Q; s64 Ans; bool isp[ONE]; s64 phi[ONE], prime[ONE], p_num;
int get() { int res=1,Q=1;char c; while( (c=getchar())<48 || c>57 ) if(c=='-')Q=-1; res=c-48; while( (c=getchar())>=48 && c<=57 ) res=res*10+c-48; return res*Q; }
void Get_phi(int MaxN) { phi[1] = 1; for(int i = 2; i <= MaxN; i++) { if(!isp[i]) prime[++p_num] = i, phi[i] = i - 1; for(int j = 1; j <= p_num && i * prime[j] <= MaxN; j++) { isp[i * prime[j]] = 1; if(i % prime[j] == 0) { phi[i * prime[j]] = phi[i] * prime[j]; break; } phi[i * prime[j]] = phi[i] * phi[prime[j]]; } } }
int main() { cin>>n; Q = sqrt(n); Get_phi(Q); for(int i = 2; i <= Q; i++) Ans += (n / i / i) * phi[i]; printf("%lld", Ans); }
|